Disconnect signal handlers on adjustment in destroy handler
authorBenjamin Otte <otte@gnome.org>
Sat, 19 Dec 2009 12:46:18 +0000 (13:46 +0100)
committerBenjamin Otte <otte@gnome.org>
Sat, 19 Dec 2009 12:50:39 +0000 (13:50 +0100)
Not removing the signal handler caused crashes if the adjustment
survived longer than the scrolled window and still emitted signals. This
could happen inside WebKit.

gtk/gtkscrolledwindow.c

index b4112ae5f7c724770b74f61a2d9d32350271a109..d2d876957fe34dc001771a1e8cae07e972111d7d 100644 (file)
@@ -852,6 +852,9 @@ gtk_scrolled_window_destroy (GtkObject *object)
 
   if (scrolled_window->hscrollbar)
     {
+      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
+                                           gtk_scrolled_window_adjustment_changed,
+                                           scrolled_window);
       gtk_widget_unparent (scrolled_window->hscrollbar);
       gtk_widget_destroy (scrolled_window->hscrollbar);
       g_object_unref (scrolled_window->hscrollbar);
@@ -859,6 +862,9 @@ gtk_scrolled_window_destroy (GtkObject *object)
     }
   if (scrolled_window->vscrollbar)
     {
+      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
+                                           gtk_scrolled_window_adjustment_changed,
+                                           scrolled_window);
       gtk_widget_unparent (scrolled_window->vscrollbar);
       gtk_widget_destroy (scrolled_window->vscrollbar);
       g_object_unref (scrolled_window->vscrollbar);